// -----
// 基础的顶点着色器
// -----

// 顶点坐标
attribute vec3 attribute_position;
// 顶点法线
attribute vec3 attribute_normal;
// 顶点颜色
attribute vec4 attribute_color;
// 顶点 UV0
attribute vec2 attribute_uv0;

// 最终输出的顶点坐标, 正常情况下就是 attribute_position, 蒙皮动画中会被设置为通过骨骼运算出的坐标
vec3 e_position = vec3(0.0, 0.0, 0.0);

// 模型全局转换信息矩阵
uniform mat4 uniform_ModelMatrix;
// 摄像机全局转换信息逆矩阵
uniform mat4 uniform_ViewMatrix;
// 摄像机投影矩阵
uniform mat4 uniform_ProjectionMatrix;

// 眼睛法线
varying vec3 varying_eyeNormal;
// 顶点 UV0
varying vec2 varying_uv0;
// 顶点颜色
varying vec4 varying_color;
// 世界坐标
varying vec4 varying_worldPosition;
// 世界法线
varying vec3 varying_worldNormal;

// 输出坐标
vec4 outPosition;

// 转置
mat4 transpose(mat4 inMatrix) {
    vec4 i0 = inMatrix[0];
    vec4 i1 = inMatrix[1];
    vec4 i2 = inMatrix[2];
    vec4 i3 = inMatrix[3];

    mat4 outMatrix = mat4(
                 vec4(i0.x, i1.x, i2.x, i3.x),
                 vec4(i0.y, i1.y, i2.y, i3.y),
                 vec4(i0.z, i1.z, i2.z, i3.z),
                 vec4(i0.w, i1.w, i2.w, i3.w)
                 );

    return outMatrix;
}

// 反转
mat4 inverse(mat4 m) {
    float
        a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],
        a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],
        a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],
        a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],

        b00 = a00 * a11 - a01 * a10,
        b01 = a00 * a12 - a02 * a10,
        b02 = a00 * a13 - a03 * a10,
        b03 = a01 * a12 - a02 * a11,
        b04 = a01 * a13 - a03 * a11,
        b05 = a02 * a13 - a03 * a12,
        b06 = a20 * a31 - a21 * a30,
        b07 = a20 * a32 - a22 * a30,
        b08 = a20 * a33 - a23 * a30,
        b09 = a21 * a32 - a22 * a31,
        b10 = a21 * a33 - a23 * a31,
        b11 = a22 * a33 - a23 * a32,

        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;

    return mat4(
        a11 * b11 - a12 * b10 + a13 * b09,
        a02 * b10 - a01 * b11 - a03 * b09,
        a31 * b05 - a32 * b04 + a33 * b03,
        a22 * b04 - a21 * b05 - a23 * b03,
        a12 * b08 - a10 * b11 - a13 * b07,
        a00 * b11 - a02 * b08 + a03 * b07,
        a32 * b02 - a30 * b05 - a33 * b01,
        a20 * b05 - a22 * b02 + a23 * b01,
        a10 * b10 - a11 * b08 + a13 * b06,
        a01 * b08 - a00 * b10 - a03 * b06,
        a30 * b04 - a31 * b02 + a33 * b00,
        a21 * b02 - a20 * b04 - a23 * b00,
        a11 * b07 - a10 * b09 - a12 * b06,
        a00 * b09 - a01 * b07 + a02 * b06,
        a31 * b01 - a30 * b03 - a32 * b00,
        a20 * b03 - a21 * b01 + a22 * b00) / det;
}

void main() {
    e_position = attribute_position;
    varying_color = attribute_color;
    varying_uv0 = attribute_uv0;

    varying_worldPosition = uniform_ModelMatrix * vec4(e_position, 1.0);
    varying_worldNormal = normalize((uniform_ModelMatrix * vec4(attribute_normal, 0.0)).xyz);
}
